/*****************************
功  能：数码管、定时/计数器、流水灯的综合应用
编程人：ZZT
版  本：V1.0
时  间：2023/12/22
*******************************/
//头文件的声明
#include <Reg51.h>
#include "display.h"
#include <intrins.h>

//函数的声明
void Timer0Init(void);//定时器0初始化
void Timer1Init(void);//定时器1初始化

//全局变量的声明
unsigned char secCnt;//计时1s的次数
unsigned char sec = 60;//倒计时60s
unsigned char timerCnt;//流水灯间隔50ms计数
unsigned char temp = 0xFE;

/**********************************
函数名：main
功  能：完成程序模块的调用
参  数：无
返回值：无
***********************************/
void main()
{
	Timer0Init();
	Timer1Init();
	EA = 1;//打开中断总开关
	while(1)
	{
		LEDBuff[0] = 23;
		LEDBuff[1] = 23;
		LEDBuff[2] = sec / 10;
		LEDBuff[3] = sec % 10;
	}
}

/**********************************
函数名：Timer0Init
功  能：定时器0初始化
参  数：无
返回值：无
***********************************/
void Timer0Init(void)		//1毫秒@11.0592MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	ET0 = 1;		//打开定时器0中断
	TR0 = 1;		//定时器0开始计时
}

/**********************************
函数名：Timer1Init
功  能：定时器1初始化
参  数：无
返回值：无
***********************************/
void Timer1Init(void)		//50毫秒@11.0592MHz
{
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x10;		//设置定时器模式
	TL1 = 0x00;		//设置定时初值
	TH1 = 0x4C;		//设置定时初值
	TF1 = 0;		//清除TF1标志
	ET1 = 1;		//打开定时器1中断
	TR1 = 1;		//定时器1开始计时
}

/************************************
1、中断服务函数一定是一个没有返回值的函数
2、中断服务函数一定是没有参数的函数
3、中断服务函数函数名后跟关键字 interrupt
4、interrupt n 0 - 4  5个中断源     8 * n + 0003H 
   0003H INT0 00BH T0 0013H INT1 001BH T1 0023H ES
5、中断服务函数不能被主程序或其他程序所调用
6、n 后面 跟 using m (0 - 3) 工作寄存器组
***************************************/
void timer0_ISR(void) interrupt 1
{
	TR0 = 0;
	Display();		//数码管动态显示
	TL0 = 0x66;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TR0 = 1;
}

void timer1_ISR(void) interrupt 3
{
	TR1 = 0;
	secCnt++;
	timerCnt++;
	if(timerCnt >= 10)//每50ms实现流水灯
	{
		timerCnt = 0;
		P2 = temp;
		temp = _crol_(temp, 1);
	}
	if(secCnt >= 20)//60s倒计时
	{
		secCnt = 0;
		sec--;
		if(sec > 60)
			sec = 60;
	}
	TL1 = 0x00;		//设置定时初值
	TH1 = 0x4C;		//设置定时初值
	TR1 = 1;
}